package org.javacore.base.objects;

/**
 * @author: fanliu
 * @description
 * @date: 2025/3/28 17:08
 */
public class OClassTest {

    static class A {
        public void m(A a) {
            System.out.println("AA");
        }
        public void m(D d) {
            System.out.println("AD");
        }
    }
    static class B extends A {
        @Override
        public void m(A a) {
            System.out.println("BA");
        }
        public void m(B b) {
            System.out.println("BD");
        }
    }
    static class C extends B{}
    static class D extends B{}


    /**
     * 父类引用指向子类对象，方法调用看实际对象类型，但方法重载的解析看引用类型
     *
     * 重点：
     * 编译时引用类型（静态绑定）
     * 运行时对象类型（动态绑定）
     *
     * @param args
     */

    public static void main(String[] args) {
        A a = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        a.m(a);
        a.m(b);
        a.m(c);
        a.m(d);
    }




}
